package com.ruubypay.biz.utils.DateUtils;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


/**
 * Title: 时间获取
 * Description: 获取格式化时间
 * Company:com.ruubypay
 */
public class DateUtil {

    public static final String[] months = {"一月", "二月", "三月", "四月", "五月", "六月","七月", "八月", "九月", "十月", "十一月", "十二月",};

    public static final String[] quarters = {"一季度", "二季度", "三季度", "四季度"};

    /**
     * 获取当前年度字符串。
     *  日期字符串格式： yyyy 表示4位年
     * @return String "yyyy"格式的当前年度字符串。
     */
    public static String getNowYear() {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
        return formatter.format(new Date());
    }

    /**
     * 获取当前月度字符串。
     *  日期字符串格式： MM
     * @return
     */
    public static String getNowMonth() {
        SimpleDateFormat formatter = new SimpleDateFormat("MM");
        return formatter.format(new Date());
    }

    /**
     * 获取当前日字符串。
     *  日期字符串格式： dd
     * @return
     */
    public static String getNowDay() {
        SimpleDateFormat formatter = new SimpleDateFormat("dd");
        return formatter.format(new Date());
    }

    /**
     * 将“yyyy/MM/dd HH:mm:ss”格式的日期字符串转换为“yyyyMMddHHmmss”格式的日期字符串。
     * @param source
     * @return String  yyyyMMddHHmmss
     */
    public static String toPlainDateTime(String source,String pattern) {
        Date date = parseDate(source,pattern);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
        return formatter.format(date);
    }

    /**
     * 获取日期字符串。
     * @return String "yyyy-MM-dd"格式的日期字符串。
     */
    public static String getHyphenDate() {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        return formatter.format(new Date());
    }

    /*
    *  获取当前日期的前一天
    */
    public static String getAgoDay() {

        SimpleDateFormat nextDay = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, -1);//当前系统时间的  前一天
        String onedayago = nextDay.format(calendar.getTime());
        return onedayago;
    }

    /**
     * 根据传进来的字符串日期，获取前一天的数据
      * @param source
     * @return
     */
    public static String getStringToAgoDate(String source) throws ParseException {
        if (source == null) {
            return null;
        }else {
            Calendar c = Calendar.getInstance();
            Date date = null;
            try {
                date = new SimpleDateFormat("yy-MM-dd").parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            c.setTime(date);
            int day = c.get(Calendar.DATE);
            c.set(Calendar.DATE, day - 1);

            String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
            return dayBefore;
        }
    }


    public static String getStringToSevenAgoDayDate(String source) throws ParseException {

        if (source == null) {
            return null;
        }else
        {
            Calendar c = Calendar.getInstance();
            Date date=null;
            try {
                date = new SimpleDateFormat("yy-MM-dd").parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            c.setTime(date);
            int day=c.get(Calendar.DATE);
            c.set(Calendar.DATE,day-7);

            String dayBefore=new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
            return dayBefore;
        }

    }


    public static Date getDateToAgoDate(String source) throws ParseException {


        Calendar c = Calendar.getInstance();
        Date date=null;
        try {
            date = new SimpleDateFormat("yy-MM-dd").parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c.setTime(date);
        int day=c.get(Calendar.DATE);
        c.set(Calendar.DATE,day-1);

        String dayBefore=new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
//        return dayBefore;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.parse(dayBefore, new ParsePosition(0));

    }

    /**
     * 获取前一日的凌晨2点时间
     * @return
     */
    public static String getAgoTwoOclockDay() {

        SimpleDateFormat nextDay = new SimpleDateFormat("yyyy-MM-dd 02:00:00");
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, -1);//当前系统时间的  前一天
        String onedayago = nextDay.format(calendar.getTime());
        return onedayago;
    }

    /**
     * 获取时间字符串。
     * @return String "HH:mm:ss"格式的时间字符串。
     */
    public static String getHyphenTime() {
        SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
        return df.format(new Date());
    }


    /**
     * 获取日期字符串。
     * @param date 需要转化的日期。
     * @return String "yyyy-MM-dd"格式的日期字符串。
     */
    public static String getHyphen_Date(Date date) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        return formatter.format(date);
    }

    /**
     * 获取标准格式当前日期和时间
     * @return String
     */
    public static String getHyphenDateTime() {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return formatter.format(new Date());
    }

    /**
     * 查询当前日期的凌晨2点时间
     */
    public static String getHyphenDateTwoOclockTime() {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd 02:00:00");
        return formatter.format(new Date());
    }



    /**
     * 获取日期字符串。
     * @return String "yyyyMMdd"格式的日期字符串。
     */
    public static String getPlainDate() {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
        return formatter.format(new Date());
    }

    /**
     * 获取时间字符串。
     * @return String "HHmmss"格式的日期字符串。
     */
    public static String getPlainTime() {
        SimpleDateFormat formatter = new SimpleDateFormat("HHmmss");
        return formatter.format(new Date());
    }

    /**
     * 获取简单格式当前日期和时间
     * @return String
     */
    public static String getPlainDateTime() {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
        return formatter.format(new Date());
    }



    /**
     * 按指定格式获取日期
     * @param pattern 日期格式
     * @return 指定格式的日期字符串
     */
    public static String getDateByPattern(String pattern) {
        SimpleDateFormat formatter = new SimpleDateFormat(pattern);
        return formatter.format(new Date());
    }



    /**
     * 获取日期字符串。
     * @param date 需要转化的日期。
     * @return String "yyyyMMdd"格式的日期字符串。
     */
    public static String toHyphenDate(Date date) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
        return formatter.format(date);
    }



    /**
     * 获取日期字符串。
     * @param date 需要转化的日期。
     * @return String "yyyyMMddHHmmss"格式的日期字符串。
     */
    public static String parseHyphenDateTime(Date date) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
        return formatter.format(date);
    }

    /**
     * 获取日期字符串。
     * @param date 需要转化的日期。
     * @return String "yyyy-MM-dd- HH:mm:ss"格式的日期字符串。
     */
    public static String parsePlainDateTime(Date date) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return formatter.format(date);
    }


    /**
     * 获取指定格式的日期字符串。
     * @param format 指定的格式
     * @return String 相应格式的日期字符串。
     */
    public static String getSignDate(String format) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        return formatter.format(new Date());
    }
    /**
     * 将“yyyy-MM-dd”格式的日期字符串转换为日期对象。
     * @param source 日期字符串。
     * @return Date 日期对象。
     */
    public static Date parseHyphenDate(String source) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.parse(source, new ParsePosition(0));
    }


    /**
     * 将“yyyyMMdd”格式的日期字符串转换为“yyyy-MM-dd”格式的日期字符串。
     * @param source 日期字符串。
     * @return String "yyyy-MM-dd"格式的日期字符串。
     */
    public static String toHyphenDate(String source) {
        Date date = parsePlainDate(source);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        return formatter.format(date);
    }



    /**
     * 将"yyyyMMdd"格式的日期字符串转换为日期对象。
     * @param source 日期字符串。
     * @return Date 日期对象。
     */
    public static Date parsePlainDate(String source) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.parse(source, new ParsePosition(0));
    }

    /**
     *
     */
    public static Date parseCorrectPlainDate(String source) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.parse(source, new ParsePosition(0));
    }


    /**
     * 将“yyyy-MM-dd”格式的日期字符串转换为“yyyyMMdd”格式的日期字符串。
     * @param source 日期字符串。
     * @return String "yyyymmdd"格式的日期字符串。
     */
    public static String toPlainDate(String source) {
        Date date = parseHyphenDate(source);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
        return formatter.format(date);
    }

    /**
     * 将“yyyy-mm-dd HH:mm:ss”格式的日期字符串转换为“yyyyMMddhhmmss”格式的日期字符串。
     * @param source 日期字符串。
     * @return String "yyyyMMddhhmmss"格式的日期字符串。
     */
    public static String hyphenToPlain(String source){
        String reg = "(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})";
        source = source.replaceAll(reg, "$1$2$3$4$5$6");
        return source;
    }

    /**
     * 将“yyyyMMddhhmmss”格式的日期字符串转换为“yyyy-mm-dd HH:mm:ss”格式的日期字符串。
     * @param source 日期字符串。
     * @return String "yyyy-mm-dd HH:mm:ss"格式的日期字符串。
     */
    public static String plainToHyphen(String source){
        String reg = "(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})";
        source = source.replaceAll(reg, "$1-$2-$3 $4:$5:$6");
        return source;
    }



    /**
     * 将指定格式的日期字符串转换为日期对象。
     * @param source  日期字符串。
     * @param pattern 模式。
     * @return Date 日期对象。
     */
    public static Date parseDate(String source, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.parse(source, new ParsePosition(0));
    }


    /**
     * 判断时间date1是否在时间date2之前   时间格式 2005-4-21 16:16:34
     * @param date1 时间1
     * @param date2 时间2
     * @return
     */
    public static boolean isDateBefore(String date1, String date2) {
        try {
            DateFormat df = DateFormat.getDateTimeInstance();
            return df.parse(date1).before(df.parse(date2));
        } catch (ParseException e) {
            System.out.println("[SYS] " + e.getMessage());
            return false;
        }
    }


    /**
     * 时间相加
     * @param begintime 开始时间 “yyyy-MM-dd HH:mm:ss” 格式
     * @param second    秒数
     * @return 返回相加后的日期，格式如开始时间
     */
    public static String addSeconds(String begintime, int second) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date StartDate = null;
        try {
            StartDate = format.parse(begintime);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Calendar c = Calendar.getInstance();
        c.setTime(StartDate);
        c.add(c.SECOND, second);

        return format.format(c.getTime());
    }

    /**
     * 日期相加
     * @param day 天数
     * @return 返回相加后的日期
     * 获取当前时间的毫秒数 （System.currentTimeMillis()）
     */
    public static String addDay(String date,int day) {
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(getMillis(date) + ((long) day) * 24 * 3600 * 1000);
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return df.format(c.getTime());
    }

    /**
     * 日期相加
     *
     * @param day 天数
     * @return 返回相加后的日期
     */
    public static String addDate(int day, String pattern) {
        SimpleDateFormat formatter = new SimpleDateFormat(pattern);
        Date beginDate = new Date();
        Calendar date = Calendar.getInstance();
        date.setTime(beginDate);
        date.set(Calendar.DATE, date.get(Calendar.DATE) + day);
        return formatter.format(date.getTime());
    }


    /**
     * 返回毫秒
     * @param DateTime 指定日期时间
     * @return 返回指定日期时间的毫秒
     */
    public static long getMillis(String DateTime) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = format.parse(DateTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.getTimeInMillis();
    }

    /**
     * 获取时间戳，将日期对象转换为时间戳类型。
     * @param date 日期对象
     * @return Timestamp 时间戳
     */
    public static Timestamp getTimestamp(Date date) {
        return new Timestamp(date.getTime());
    }

    /**
     * 获取时间戳，将当前日期转换为时间戳类型。
     * @return Timestamp 时间戳
     */
    public static Timestamp getTimestamp() {
        return new Timestamp(new Date().getTime());
    }

    /**
     * 将“yyyyMMdd”格式的日期字符串转换为Timestamp类型的对象。
     * @param source 日期字符串
     * @return Timestamp 时间戳
     */
    public static Timestamp parseTimestamp(String source) {
        Date date = parsePlainDate(source);
        return getTimestamp(date);
    }

    /**
     * 获取以前的月份标识
     ** @param i 几个月
     * @return 指定月份标识
     */
    public static String getMonthStr(int i,String Param) {
        SimpleDateFormat sdf = new SimpleDateFormat(Param);
        Date date = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, -i);
        return sdf.format(cal.getTime());
    }

    public static long getCompareDate() throws ParseException {
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd");
        Date date1=formatter.parse("1900-01-01");
        Date date2= new Date();
        long l = date2.getTime() - date1.getTime();
        long d = l/(24*60*60*1000);
        return d;
    }

    public static long getCompareSecond() throws ParseException {
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date1=formatter.parse("1900-01-01 00:00:00");
        Date date2= new Date();
        long l = date2.getTime() - date1.getTime();
        long d = l/1000;
        return d;
    }

    /**
     * 将一个时间戳转换为天时，分秒这样的类型
     * @param timeMillons 毫秒值
     * @return 返回转换结果
     */
    public static String getTimeAsString(Long timeMillons){
        if (timeMillons==null){
            return null;
        }
        Long tian = timeMillons / (1000*60*60*24);
        Long shi = (timeMillons % (1000*60*60*24))/(1000*60*60);
        Long fen = (timeMillons % (1000*60*60*24))%(1000*60*60)/(1000*60);
        Long miao = (timeMillons % (1000*60*60*24))%(1000*60*60)%(1000*60)/1000;
        return tian+"天"+shi+"时"+fen+"分"+miao+"秒";
    }
}